import java.util.HashSet;
import java.util.Set;

class AlphabetUtil {
    public static Set<Set<Character>> createAlphabet() {
        Set<Set<Character>> alphabet = new HashSet<>();
        alphabet.add(getLetters());
        alphabet.add(getDigits());
        alphabet.add(getSpecialCharacters());
        return alphabet;
    }

    public static Set<Character> getLetters() {
        Set<Character> letters = new HashSet<>();
        for (char c = 'a'; c <= 'z'; c++) letters.add(c);
        for (char c = 'A'; c <= 'Z'; c++) letters.add(c);
        letters.add('_');
        return letters;
    }

    public static Set<Character> getDigits() {
        Set<Character> digits = new HashSet<>();
        for (char c = '1'; c <= '9'; c++) digits.add(c);
        return digits;
    }

    public static Set<Character> getSpecialCharacters() {
        Set<Character> special = new HashSet<>();
        special.add('.');
        return special;
    }
    public static Set<Character> getZero() {
        Set<Character> special = new HashSet<>();
        special.add('0');
        return special;
    }

    public static Set<String> getPrintableChars() {
        return Set.of(
                // 大写字母 A-Z
                "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
                // 小写字母 a-z
                "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
                // 数字 0-9
                "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
                // 标点符号和其他符号
                "!", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", ":", ";", "<", "=", ">", "?", "@", "[", "\\", "]", "^", "_", "`", "{", "|", "}", "~",
                // 控制字符
                "\\n", "\\t", "\\r", " "  // 换行符、制表符、回车符、空格
        );
    }

}
